﻿package com.winglish.as3.utils {
	import flash.utils.ByteArray;
	
	public class ArrayUtil {
		public function ArrayUtil() {}
		/**
		 * 배열 항목 랜덤으로 섞기.
		 * @param	array
		 * @param	startIndex
		 * @param	endIndex
		 * @return
		 */
		static public function shuffle( array: Array, startIndex: int = 0, endIndex: int = 0 ):Array {
			//trace( "shuffle before : ", array );
			if ( startIndex == 0 && endIndex == 0 ) {
				startIndex = 0;
				endIndex = array.length - 1;
			}
			for (var i:int = endIndex; i > startIndex; i--) {
				var randNum: int = (Math.random()*100)%array.length
				var tmp: Object = array[ i ];
				array[ i ] = array[ randNum ];
				array [randNum ] = tmp;
			}
			trace( "shuffle after : ", array );
			return array;
		}
		
		/**
		 * len 길이만큼 숫자 랜덤으로 섞기.
		 * @param	len
		 * @return
		 */
		static public function randomArray( len: int ): Array{
			var tempAry: Array = [];
			for( var i: int = 0; i < len; ++i ){
				tempAry.push( i );
			}
			return shuffle(shuffle( tempAry ));
		}
		
		/**
		 * 배열에서 특정 항목 지우기.
		 * @param	array
		 * @param	index
		 * @return
		 */
		static public function remove( array: Array, index: Object ):Array {
			for (var i:String in array) {
				if ( !isNaN( index + 1 ) ? index == i : index == array[ i ] ) array.splice( i, 1 );
			}
			return array;
		}
		
		/**
		 * 차수 포함한 배열의 길이 구하기.
		 * @param	array
		 * @param	depth
		 * @return
		 */
		static public function getLength(array:Array, depth:int):int {
			var len:int = 0;
			var depth:int = depth - 1;
			if (depth != 0) {
				for (var i:int = 0; i < array.length; i++) {
					if (array[i] is Array) len += getLength(array[i], depth);
				}
			}else if (depth == 0) {
				len += array.length;
			}
			return len;
		}
		
		/**
		 * 2개의 배열 값이 같은지 비교.
		 * @param	arr1
		 * @param	arr2
		 * @return
		 */
		static public function compareArray(arr1:Array, arr2:Array):Boolean {
			var len:int = (arr1.length >= arr2.length) ? arr1.length:arr2.length;
			var compare:Boolean = true;
			for (var i:int = 0; i < len; i++) {
				if (arr1[i] != arr2[i]) {
					compare = false;
					break;
				}
			}
			return compare;
		}
		
		
		/**
		 * 배열에서 중복값을 제외해서 가져오기.
		 * @param	arr
		 * @return
		 */
		static public function removeOverlapData(arr:Array):Array {
			var tmpArr:Array = new Array();
			for (var i:uint = 0; i < arr.length; i++) {
				if (i == 0) {
					tmpArr.push(arr[i]);
				}else {
					for (var j:uint = 0; j < tmpArr.length; j++) {
						var overlap:Boolean = false
						if (tmpArr[j] == arr[i]) {
							overlap = true;
							break;
						}
					}
					if (!overlap) tmpArr.push(arr[i]);
				}
			}
			return tmpArr;
		}
	}
}